package GestionDeDatos;

import InfoCliente.*;
import Filtros.*;
import Excepciones.*;

import java.util.ArrayList;

import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;

public class ConsultorBD {
	
	public void IniciarSesion(UsuarioActivo usuario) throws SOAPException, InvalidLogInException, 
			DatabaseException, CheckException {
		
		ClienteSOAP cliente = ClienteSOAP.Cliente();
		SOAPMessage mensaje = cliente.CrearMensaje();
        
        SOAPPart soapPart = mensaje.getSOAPPart();
        SOAPEnvelope envelope = soapPart.getEnvelope();
      		  
        SOAPBody soapBody = envelope.getBody();
        SOAPElement soapBodyElem = soapBody.addChildElement("IniciarSesion");
        SOAPElement soapElemSon = soapBodyElem.addChildElement("usuario");
        soapElemSon.addChildElement("padron").addTextNode(usuario.getPadron().toString());
        soapElemSon.addChildElement("contrasena").addTextNode(usuario.getContraseña());

        mensaje.saveChanges();
        SOAPMessage reply = cliente.EnviarMensaje(mensaje);
        
        ExceptionHandler.InvalidLogInExceptionScan(reply);
        ExceptionHandler.DatabaseExceptionScan(reply);
        ExceptionHandler.CheckExceptionScan(reply);
	}
	
	public void CerrarSesion(UsuarioActivo usuario) {
		
		usuario = null;
	}

	public ResultadoConsulta ObtenerDepartamentos(UsuarioActivo usuario) throws SOAPException, InvalidLogInException, 
			DatabaseException, CheckException, QueryException {

		ClienteSOAP cliente = ClienteSOAP.Cliente();
		SOAPMessage mensaje = cliente.CrearMensaje();
		
		SOAPPart soapPart = mensaje.getSOAPPart();
		SOAPEnvelope envelope = soapPart.getEnvelope();
				  
		SOAPBody soapBody = envelope.getBody();
		SOAPElement soapBodyElem = soapBody.addChildElement("ObtenerDepartamentos");
		SOAPElement soapElemSon = soapBodyElem.addChildElement("usuario");
		soapElemSon.addChildElement("padron").addTextNode(usuario.getPadron().toString());
		soapElemSon.addChildElement("contrasena").addTextNode(usuario.getContraseña());
		
		mensaje.saveChanges();
		SOAPMessage reply = cliente.EnviarMensaje(mensaje);
		
		ExceptionHandler.InvalidLogInExceptionScan(reply);
		ExceptionHandler.DatabaseExceptionScan(reply);
		ExceptionHandler.CheckExceptionScan(reply);
		ExceptionHandler.QueryExceptionScan(reply);
		
		return new ResultadoConsulta(reply);
	}
	
	public ResultadoConsulta ObtenerMaterias(UsuarioActivo usuario, Integer departamento) throws SOAPException, InvalidLogInException, 
			DatabaseException, CheckException, QueryException {

		ClienteSOAP cliente = ClienteSOAP.Cliente();
		SOAPMessage mensaje = cliente.CrearMensaje();
		
		SOAPPart soapPart = mensaje.getSOAPPart();
		SOAPEnvelope envelope = soapPart.getEnvelope();
				  
		SOAPBody soapBody = envelope.getBody();
		SOAPElement soapBodyElem = soapBody.addChildElement("ObtenerMaterias");
		
		SOAPElement soapFirstSon = soapBodyElem.addChildElement("usuario");
		soapFirstSon.addChildElement("padron").addTextNode(usuario.getPadron().toString());
		soapFirstSon.addChildElement("contrasena").addTextNode(usuario.getContraseña());
		
		SOAPElement soapSecondSon = soapBodyElem.addChildElement("departamento");
		soapSecondSon.addChildElement("codigo").addTextNode(departamento.toString());
		
		mensaje.saveChanges();
		SOAPMessage reply = cliente.EnviarMensaje(mensaje);
		
		ExceptionHandler.InvalidLogInExceptionScan(reply);
		ExceptionHandler.DatabaseExceptionScan(reply);
		ExceptionHandler.CheckExceptionScan(reply);
		ExceptionHandler.QueryExceptionScan(reply);
		
		return new ResultadoConsulta(reply);
	}
	
	public ResultadoConsulta ObtenerCursos(UsuarioActivo usuario, Integer departamento, Integer materia) throws SOAPException, InvalidLogInException, 
			DatabaseException, CheckException, QueryException {

		ClienteSOAP cliente = ClienteSOAP.Cliente();
		SOAPMessage mensaje = cliente.CrearMensaje();
		
		SOAPPart soapPart = mensaje.getSOAPPart();
		SOAPEnvelope envelope = soapPart.getEnvelope();
				  
		SOAPBody soapBody = envelope.getBody();
		SOAPElement soapBodyElem = soapBody.addChildElement("ObtenerCursos");
		
		SOAPElement soapFirstSon = soapBodyElem.addChildElement("usuario");
		soapFirstSon.addChildElement("padron").addTextNode(usuario.getPadron().toString());
		soapFirstSon.addChildElement("contrasena").addTextNode(usuario.getContraseña());
		
		SOAPElement soapSecondSon = soapBodyElem.addChildElement("materia");
		soapSecondSon.addChildElement("departamento").addTextNode(departamento.toString());
		soapSecondSon.addChildElement("codigo").addTextNode(materia.toString());
		
		mensaje.saveChanges();
		SOAPMessage reply = cliente.EnviarMensaje(mensaje);
		
		ExceptionHandler.InvalidLogInExceptionScan(reply);
		ExceptionHandler.DatabaseExceptionScan(reply);
		ExceptionHandler.CheckExceptionScan(reply);
		ExceptionHandler.QueryExceptionScan(reply);
		
		return new ResultadoConsulta(reply);
	}
	
	public ResultadoConsulta ObtenerHorarios(UsuarioActivo usuario, Integer departamento, Integer materia, String curso) throws SOAPException, InvalidLogInException, 
			DatabaseException, CheckException, QueryException {

		ClienteSOAP cliente = ClienteSOAP.Cliente();
		SOAPMessage mensaje = cliente.CrearMensaje();
		
		SOAPPart soapPart = mensaje.getSOAPPart();
		SOAPEnvelope envelope = soapPart.getEnvelope();
				  
		SOAPBody soapBody = envelope.getBody();
		SOAPElement soapBodyElem = soapBody.addChildElement("ObtenerHorarios");
		
		SOAPElement soapFirstSon = soapBodyElem.addChildElement("usuario");
		soapFirstSon.addChildElement("padron").addTextNode(usuario.getPadron().toString());
		soapFirstSon.addChildElement("contrasena").addTextNode(usuario.getContraseña());
		
		SOAPElement soapSecondSon = soapBodyElem.addChildElement("curso");
		soapSecondSon.addChildElement("departamento").addTextNode(departamento.toString());
		soapSecondSon.addChildElement("materia").addTextNode(materia.toString());
		soapSecondSon.addChildElement("codigo").addTextNode(curso);
		
		mensaje.saveChanges();
		SOAPMessage reply = cliente.EnviarMensaje(mensaje);
		
		ExceptionHandler.InvalidLogInExceptionScan(reply);
		ExceptionHandler.DatabaseExceptionScan(reply);
		ExceptionHandler.CheckExceptionScan(reply);
		ExceptionHandler.QueryExceptionScan(reply);
		
		return new ResultadoConsulta(reply);
	}
	
	public ResultadoConsulta ObtenerInscripciones(UsuarioActivo usuario) throws SOAPException, InvalidLogInException, 
			DatabaseException, CheckException, QueryException {
		
		ClienteSOAP cliente = ClienteSOAP.Cliente();
		SOAPMessage mensaje = cliente.CrearMensaje();
        
        SOAPPart soapPart = mensaje.getSOAPPart();
        SOAPEnvelope envelope = soapPart.getEnvelope();
      		  
        SOAPBody soapBody = envelope.getBody();
        SOAPElement soapBodyElem = soapBody.addChildElement("ObtenerInscripciones");
        SOAPElement soapElemSon = soapBodyElem.addChildElement("usuario");
        soapElemSon.addChildElement("padron").addTextNode(usuario.getPadron().toString());
        soapElemSon.addChildElement("contrasena").addTextNode(usuario.getContraseña());

        mensaje.saveChanges();
        SOAPMessage reply = cliente.EnviarMensaje(mensaje);
        
        ExceptionHandler.InvalidLogInExceptionScan(reply);
        ExceptionHandler.DatabaseExceptionScan(reply);
        ExceptionHandler.CheckExceptionScan(reply);
        ExceptionHandler.QueryExceptionScan(reply);
        
        return new ResultadoConsulta(reply);
	}
	
	public ResultadoConsulta ObtenerSolicitudes(UsuarioActivo usuario) throws SOAPException, InvalidLogInException, 
			DatabaseException, CheckException, QueryException {
		
		ClienteSOAP cliente = ClienteSOAP.Cliente();
		SOAPMessage mensaje = cliente.CrearMensaje();
        
        SOAPPart soapPart = mensaje.getSOAPPart();
        SOAPEnvelope envelope = soapPart.getEnvelope();
      		  
        SOAPBody soapBody = envelope.getBody();
        SOAPElement soapBodyElem = soapBody.addChildElement("ObtenerSolicitudes");
        SOAPElement soapElemSon = soapBodyElem.addChildElement("usuario");
        soapElemSon.addChildElement("padron").addTextNode(usuario.getPadron().toString());
        soapElemSon.addChildElement("contrasena").addTextNode(usuario.getContraseña());

        mensaje.saveChanges();
        SOAPMessage reply = cliente.EnviarMensaje(mensaje);
        
        ExceptionHandler.InvalidLogInExceptionScan(reply);
        ExceptionHandler.DatabaseExceptionScan(reply);
        ExceptionHandler.CheckExceptionScan(reply);
        ExceptionHandler.QueryExceptionScan(reply);
        
        return new ResultadoConsulta(reply);
	}
	
	public ResultadoConsulta ObtenerAmistades(UsuarioActivo usuario) throws SOAPException, InvalidLogInException, 
			DatabaseException, CheckException, QueryException {
		
		ClienteSOAP cliente = ClienteSOAP.Cliente();
		SOAPMessage mensaje = cliente.CrearMensaje();
        
        SOAPPart soapPart = mensaje.getSOAPPart();
        SOAPEnvelope envelope = soapPart.getEnvelope();
      		  
        SOAPBody soapBody = envelope.getBody();
        SOAPElement soapBodyElem = soapBody.addChildElement("ObtenerAmistades");
        SOAPElement soapElemSon = soapBodyElem.addChildElement("usuario");
        soapElemSon.addChildElement("padron").addTextNode(usuario.getPadron().toString());
        soapElemSon.addChildElement("contrasena").addTextNode(usuario.getContraseña());

        mensaje.saveChanges();
        SOAPMessage reply = cliente.EnviarMensaje(mensaje);
        
        ExceptionHandler.InvalidLogInExceptionScan(reply);
        ExceptionHandler.DatabaseExceptionScan(reply);
        ExceptionHandler.CheckExceptionScan(reply);
        ExceptionHandler.QueryExceptionScan(reply);
        
        return new ResultadoConsulta(reply);
	}
	
	public ResultadoConsulta ConsultarPorFiltro(UsuarioActivo usuario, ArrayList<FiltroCurso> cursos, 
			ArrayList<FiltroAmigo> amigos, ArrayList<FiltroSede> sedes, ArrayList<FiltroDia> dias, 
			ArrayList<FiltroHora> horas) throws SOAPException, 
			InvalidLogInException, DatabaseException, CheckException, QueryException {

		ClienteSOAP cliente = ClienteSOAP.Cliente();
		SOAPMessage mensaje = cliente.CrearMensaje();
        
        SOAPPart soapPart = mensaje.getSOAPPart();
        SOAPEnvelope envelope = soapPart.getEnvelope();
      		  
        SOAPBody soapBody = envelope.getBody();
        SOAPElement soapBodyElem = soapBody.addChildElement("ConsultarPorFiltro");
        
        SOAPElement soapElemSon = soapBodyElem.addChildElement("usuario");
        soapElemSon.addChildElement("padron").addTextNode(usuario.getPadron().toString());
        soapElemSon.addChildElement("contrasena").addTextNode(usuario.getContraseña());
        
        SOAPElement soapElemCursos = soapBodyElem.addChildElement("cursos");
        for (int i = 0; i<cursos.size(); i++) {
        	
        	SOAPElement soapElemCurso = soapElemCursos.addChildElement("curso");
            soapElemCurso.addChildElement("departamento").addTextNode(cursos.get(i).getDepartamento().toString());
            soapElemCurso.addChildElement("materia").addTextNode(cursos.get(i).getMateria().toString());
            soapElemCurso.addChildElement("curso").addTextNode(cursos.get(i).getCurso());
        }
        
        SOAPElement soapElemAmigos = soapBodyElem.addChildElement("amigos");
        for (int i = 0; i<amigos.size(); i++) {
        	
        	SOAPElement soapElemAmigo = soapElemAmigos.addChildElement("amigo");
            soapElemAmigo.addChildElement("padron").addTextNode(amigos.get(i).getPadron().toString());
        }
        
        SOAPElement soapElemSedes = soapBodyElem.addChildElement("sedes");
        for (int i = 0; i<sedes.size(); i++) {
        	
        	SOAPElement soapElemSede = soapElemSedes.addChildElement("sede");
            soapElemSede.addChildElement("sede").addTextNode(sedes.get(i).getSede());
        }
        
        SOAPElement soapElemDias = soapBodyElem.addChildElement("dias");
        for (int i = 0; i<dias.size(); i++) {
        	
        	SOAPElement soapElemDia = soapElemDias.addChildElement("dia");
            soapElemDia.addChildElement("dia").addTextNode(dias.get(i).getDia());
        }
        
        SOAPElement soapElemHoras = soapBodyElem.addChildElement("horas");
        for (int i = 0; i<horas.size(); i++) {
        	
        	SOAPElement soapElemHora = soapElemHoras.addChildElement("hora");
            soapElemHora.addChildElement("inicio").addTextNode(horas.get(i).getInicio());
            soapElemHora.addChildElement("fin").addTextNode(horas.get(i).getFin());
        }
        
        mensaje.saveChanges();
        SOAPMessage reply = cliente.EnviarMensaje(mensaje);
        
        ExceptionHandler.InvalidLogInExceptionScan(reply);
        ExceptionHandler.DatabaseExceptionScan(reply);
        ExceptionHandler.CheckExceptionScan(reply);
        ExceptionHandler.QueryExceptionScan(reply);
        
        return new ResultadoConsulta(reply);
	}
}
